// Category.java
package com.estore.service;

import java.util.*;

/**
 * 商品分类实体类
 * <p>
 * 用于表示商品的分类信息，支持父子分类结构以及分类下商品的管理。
 * </p>
 */
public class Category {
    private String categoryId;         // 分类ID
    private String categoryName;       // 分类名称
    private String description;       // 分类描述
    private Category parentCategory;  // 父分类
    private Set<Category> subCategories; // 子分类
    private Set<String> productIds;   // 属于该分类的商品ID

    /**
     * 构造方法，创建一个分类实例（不带描述）
     *
     * @param categoryId   分类ID
     * @param categoryName 分类名称
     */
    public Category(String categoryId, String categoryName) {
        this(categoryId, categoryName, "");
    }

    /**
     * 构造方法，创建一个分类实例（带描述）
     *
     * @param categoryId   分类ID
     * @param categoryName 分类名称
     * @param description  分类描述
     */
    public Category(String categoryId, String categoryName, String description) {
        this.categoryId = categoryId;
        this.categoryName = categoryName;
        this.description = description;
        this.subCategories = new HashSet<>();
        this.productIds = new HashSet<>();
    }

    /**
     * 添加商品到当前分类中
     *
     * @param productId 商品ID
     */
    public void addProduct(String productId) {
        productIds.add(productId);
    }

    /**
     * 从当前分类中移除指定商品
     *
     * @param productId 商品ID
     * @return 是否成功移除（当前实现始终返回false）
     */
    public boolean removeProduct(String productId) {
        productIds.remove(productId);
        return false;
    }

    /**
     * 添加子分类，并设置其父分类为当前分类
     *
     * @param category 子分类对象
     */
    public void addSubCategory(Category category) {
        subCategories.add(category);
        category.setParentCategory(this);
    }

    /**
     * 移除子分类，并将其父分类置为null
     *
     * @param category 子分类对象
     */
    public void removeSubCategory(Category category) {
        subCategories.remove(category);
        category.setParentCategory(null);
    }

    // Getters and Setters
    public String getCategoryId() { return categoryId; }
    public void setCategoryId(String categoryId) { this.categoryId = categoryId; }

    public String getCategoryName() { return categoryName; }
    public void setCategoryName(String categoryName) { this.categoryName = categoryName; }

    public String getDescription() { return description; }
    public void setDescription(String description) { this.description = description; }

    public Category getParentCategory() { return parentCategory; }
    public void setParentCategory(Category parentCategory) { this.parentCategory = parentCategory; }

    public Set<Category> getSubCategories() { return subCategories; }
    public void setSubCategories(Set<Category> subCategories) { this.subCategories = subCategories; }

    public Set<String> getProductIds() { return productIds; }
    public void setProductIds(Set<String> productIds) { this.productIds = productIds; }

    /**
     * 返回分类的基本信息字符串表示
     *
     * @return 格式化后的字符串，包含分类ID、名称和商品数量
     */
    @Override
    public String toString() {
        return String.format("分类ID: %s | 分类名称: %s | 商品数量: %d",
                categoryId, categoryName, productIds.size());
    }

    /**
     * 判断两个分类是否相等，基于分类ID进行比较
     *
     * @param o 要比较的对象
     * @return 如果分类ID相同则返回true，否则返回false
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Category category = (Category) o;
        return Objects.equals(categoryId, category.categoryId);
    }

    /**
     * 计算当前分类的哈希值，基于分类ID
     *
     * @return 分类ID的哈希码
     */
    @Override
    public int hashCode() {
        return Objects.hash(categoryId);
    }
}
